package Classificadores;

import java.util.ArrayList;


public class FiltroMelhoresClassificadores {

	public int filtro;
	
	public FiltroMelhoresClassificadores(String argumentosUtilizador) throws Exception{
		if(argumentosUtilizador.contains("-filtra=")){
			String numFiltro = argumentosUtilizador.split("-filtra=")[1].split(" ")[0];
			filtro = Integer.parseInt(numFiltro);
		}else{
			filtro=0;
		}
	}
	
	public ArrayList<Classificadores> filtra(ArrayList<Classificadores> classificadoresThreshold){
	
		//Acumula scores e threshold das diferentes k folds
		double[] thresholdsMedios = new double[classificadoresThreshold.get(0).classifiersList.size()];
		double[] scoresPorClassificador = new double[classificadoresThreshold.get(0).classifiersList.size()];
		for (Classificadores it : classificadoresThreshold) {
			for(int i=0; i<it.classifiersList.size(); i++){
				scoresPorClassificador[i]+= it.classifiersList.get(i).bestScore;
				thresholdsMedios[i]+=it.classifiersList.get(i).bestThreshold;
			}
		}
		
		//Didide o acumulado pelo numero de folds para obter a media de score e threshold
		for(int i=0; i<thresholdsMedios.length; i++){
			scoresPorClassificador[i]=scoresPorClassificador[i]/(classificadoresThreshold.size());
			thresholdsMedios[i]=thresholdsMedios[i]/(classificadoresThreshold.size());
		}
		
		//Determina quantos classificadores teem de ser seleccionados
		if(scoresPorClassificador.length<filtro || filtro==0)
			filtro=scoresPorClassificador.length;
		
		//Cria lista com os melhores classificadores
		ArrayList<Classificadores> listaMelhoresClassificadores = new ArrayList<Classificadores>();
		for(int i=0; i<filtro; i++){
			int idx = posicaoMaximo(scoresPorClassificador);
			Classificadores best = classificadoresThreshold.get(0).classifiersList.get(idx);
			best.reset(thresholdsMedios[idx]);
			listaMelhoresClassificadores.add(best);
			scoresPorClassificador[idx]=0;
		}
		
		return listaMelhoresClassificadores;		
	}
	
	public int posicaoMaximo(double[] lista){
		int idx=0;
		double maximo=0;
		for(int i=0; i<lista.length; i++){
			if(lista[i]>maximo){
				maximo=lista[i];
				idx=i;
			}
		}
		return idx;
	}
	
	
}
